package com.zh.mall.config;

import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.util.StringUtils;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.ArrayList;

/**
 * @author ZhengHao
 * Created At 2022/9/16.
 **/
@Configuration
//@EnableWebMvc
public class SwaggerConfig {
    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.OAS_30)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                //.apis(RequestHandlerSelectors.basePackage("com.zh.mall.controller"))
                .paths(PathSelectors.any())
                .build();
    }
    @Bean
    public ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("商城系统接口文档")
                .description("mall_tiny")
                .contact(new Contact("zhenghao", "https://www.zhenghao.com","1775825464@qq.com"))
                .version("1.0")
                .build();
    }

    /**
     * 增加如下配置可解决Spring Boot与Swagger 3.0.0 不兼容问题
     **/
    //@Bean
    //public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier, ServletEndpointsSupplier servletEndpointsSupplier, ControllerEndpointsSupplier controllerEndpointsSupplier, EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties, WebEndpointProperties webEndpointProperties, Environment environment) {
    //    List<ExposableEndpoint<?>> allEndpoints = new ArrayList();
    //    Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
    //    allEndpoints.addAll(webEndpoints);
    //    allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
    //    allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
    //    String basePath = webEndpointProperties.getBasePath();
    //    EndpointMapping endpointMapping = new EndpointMapping(basePath);
    //    boolean shouldRegisterLinksMapping = this.shouldRegisterLinksMapping(webEndpointProperties, environment, basePath);
    //    return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes, corsProperties.toCorsConfiguration(), new EndpointLinksResolver(allEndpoints, basePath), shouldRegisterLinksMapping, null);
    //}
    //private boolean shouldRegisterLinksMapping(WebEndpointProperties webEndpointProperties, Environment environment, String basePath) {
    //    return webEndpointProperties.getDiscovery().isEnabled() && (StringUtils.hasText(basePath) || ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT));
    //}
}